// pages/login/login.js
const { apiService } = require('../../utils/api')
const { showSuccess, showError, showLoading, hideLoading } = require('../../utils/util')

Page({
  data: {
    canIUse: wx.canIUse('button.open-type.getUserInfo'),
    canIUseGetUserProfile: false,
    canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName'),
    loginType: 'wechat', // wechat, sms
    phone: '',
    smsCode: '',
    countdown: 0,
    isCountingDown: false,
    debugMode: true // 调试模式
  },

  onLoad: function () {
    // 检查是否支持getUserProfile
    if (wx.getUserProfile) {
      this.setData({
        canIUseGetUserProfile: true
      })
    }

    // 检查是否已登录
    const app = getApp()
    if (app.isLoggedIn()) {
      this.redirectToHome()
    }
  },

  /**
   * 微信登录
   */
  handleWechatLogin: function() {
    if (!this.data.canIUseGetUserProfile) {
      showError('当前微信版本不支持登录功能')
      return
    }

    showLoading('登录中...')

    // 先获取登录凭证
    wx.login({
      success: (loginRes) => {
        if (loginRes.code) {
          // 获取用户信息
          this.getUserProfile(loginRes.code)
        } else {
          hideLoading()
          showError('获取登录凭证失败')
        }
      },
      fail: (error) => {
        hideLoading()
        console.error('wx.login失败:', error)
        showError('登录失败，请重试')
      }
    })
  },

  /**
   * 兼容旧版本的微信登录
   */
  handleGetUserInfo: function(e) {
    if (e.detail.userInfo) {
      showLoading('登录中...')

      // 先获取登录凭证
      wx.login({
        success: (loginRes) => {
          if (loginRes.code) {
            // 发送登录请求到后端
            const userInfo = {
              nickName: e.detail.userInfo.nickName,
              avatarUrl: e.detail.userInfo.avatarUrl
            }

            apiService.login(loginRes.code, userInfo)
              .then((result) => {
                // 保存登录状态
                const app = getApp()
                app.setLoginStatus(result, result.token)

                hideLoading()
                showSuccess('登录成功')

                // 跳转到首页
                setTimeout(() => {
                  this.redirectToHome()
                }, 1500)
              })
              .catch((error) => {
                hideLoading()
                console.error('登录请求失败:', error)
                showError(error.message || '登录失败，请重试')
              })
          } else {
            hideLoading()
            showError('获取登录凭证失败')
          }
        },
        fail: (error) => {
          hideLoading()
          console.error('wx.login失败:', error)
          showError('登录失败，请重试')
        }
      })
    } else {
      showError('已拒绝授权，无法登录')
    }
  },

  /**
   * 获取用户信息
   */
  getUserProfile: function(code) {
    wx.getUserProfile({
      desc: '用于完善用户资料',
      success: (profileRes) => {
        // 发送登录请求到后端
        const userInfo = {
          nickName: profileRes.userInfo.nickName,
          avatarUrl: profileRes.userInfo.avatarUrl
        }

        apiService.login(code, userInfo)
          .then((result) => {
            // 保存登录状态
            const app = getApp()
            app.setLoginStatus(result, result.token)

            hideLoading()
            showSuccess('登录成功')

            // 跳转到首页
            setTimeout(() => {
              this.redirectToHome()
            }, 1500)
          })
          .catch((error) => {
            hideLoading()
            console.error('登录请求失败:', error)
            showError(error.message || '登录失败，请重试')
          })
      },
      fail: (error) => {
        hideLoading()
        console.error('获取用户信息失败:', error)
        if (error.errMsg.includes('auth deny')) {
          showError('已拒绝授权，无法登录')
        } else {
          showError('获取用户信息失败')
        }
      }
    })
  },

  /**
   * 切换登录方式
   */
  switchLoginType: function(e) {
    const type = e.currentTarget.dataset.type
    console.log('切换登录方式:', type)

    this.setData({
      loginType: type
    })

    // 如果切换到短信登录，自动聚焦手机号输入框
    if (type === 'sms') {
      setTimeout(() => {
        this.focusPhoneInput()
      }, 300)
    }
  },

  /**
   * 聚焦手机号输入框
   */
  focusPhoneInput: function() {
    if (this.data.debugMode) {
      console.log('尝试聚焦手机号输入框')
    }
    // 使用select替代focus，在开发者工具中更可靠
    this.selectPhoneInput()
  },

  /**
   * 选择手机号输入框内容
   */
  selectPhoneInput: function() {
    if (this.data.debugMode) {
      console.log('选择手机号输入框')
    }
  },

  /**
   * 手机号输入框聚焦
   */
  onPhoneFocus: function(e) {
    if (this.data.debugMode) {
      console.log('手机号输入框聚焦', e.detail)
    }
  },

  /**
   * 手机号输入框失焦
   */
  onPhoneBlur: function(e) {
    if (this.data.debugMode) {
      console.log('手机号输入框失焦', e.detail)
    }
  },

  /**
   * 验证码输入框聚焦
   */
  onSmsFocus: function(e) {
    if (this.data.debugMode) {
      console.log('验证码输入框聚焦', e.detail)
    }
  },

  /**
   * 验证码输入框失焦
   */
  onSmsBlur: function(e) {
    if (this.data.debugMode) {
      console.log('验证码输入框失焦', e.detail)
    }
  },

  /**
   * 填充测试数据
   */
  fillTestData: function() {
    console.log('填充测试数据')
    this.setData({
      phone: '13800138000',
      smsCode: '123456'
    })
    showSuccess('已填充测试数据')
  },

  /**
   * 清空数据
   */
  clearData: function() {
    console.log('清空数据')
    this.setData({
      phone: '',
      smsCode: ''
    })
    showSuccess('已清空数据')
  },

  /**
   * 手机号输入
   */
  onPhoneInput: function(e) {
    const value = e.detail.value
    console.log('手机号输入:', value)

    // 只允许数字输入
    const phoneValue = value.replace(/\D/g, '').slice(0, 11)

    this.setData({
      phone: phoneValue
    })
  },

  /**
   * 验证码输入
   */
  onSmsCodeInput: function(e) {
    const value = e.detail.value
    console.log('验证码输入:', value)

    // 只允许数字输入
    const smsCodeValue = value.replace(/\D/g, '').slice(0, 6)

    this.setData({
      smsCode: smsCodeValue
    })
  },

  /**
   * 发送验证码
   */
  sendSmsCode: function() {
    const phone = this.data.phone

    if (!phone) {
      showError('请输入手机号')
      return
    }

    if (!/^1[3-9]\d{9}$/.test(phone)) {
      showError('请输入正确的手机号')
      return
    }

    if (this.data.isCountingDown) {
      return
    }

    showLoading('发送中...')
    apiService.sendSmsCode(phone)
      .then(() => {
        hideLoading()
        showSuccess('验证码已发送')
        // 开始倒计时
        this.startCountdown()
      })
      .catch((error) => {
        hideLoading()
        showError(error.message || '发送验证码失败')
      })
  },

  /**
   * 开始倒计时
   */
  startCountdown: function() {
    let countdown = 60
    this.setData({
      countdown: countdown,
      isCountingDown: true
    })

    const timer = setInterval(() => {
      countdown--
      this.setData({
        countdown: countdown
      })

      if (countdown <= 0) {
        clearInterval(timer)
        this.setData({
          countdown: 0,
          isCountingDown: false
        })
      }
    }, 1000)
  },

  /**
   * 短信验证码登录
   */
  handleSmsLogin: function() {
    const phone = this.data.phone
    const smsCode = this.data.smsCode

    if (!phone) {
      showError('请输入手机号')
      return
    }

    if (!/^1[3-9]\d{9}$/.test(phone)) {
      showError('请输入正确的手机号')
      return
    }

    if (!smsCode) {
      showError('请输入验证码')
      return
    }

    if (smsCode.length !== 6) {
      showError('请输入6位验证码')
      return
    }

    showLoading('登录中...')
    apiService.smsLogin(phone, smsCode)
      .then((result) => {
        // 保存登录状态
        const app = getApp()
        app.setLoginStatus(result, result.token)

        hideLoading()
        showSuccess('登录成功')

        // 跳转到首页
        setTimeout(() => {
          this.redirectToHome()
        }, 1500)
      })
      .catch((error) => {
        hideLoading()
        showError(error.message || '登录失败，请重试')
      })
  },

  /**
   * 跳转到首页
   */
  redirectToHome: function() {
    wx.reLaunch({
      url: '/pages/index/index'
    })
  },

  /**
   * 查看用户协议
   */
  viewUserAgreement: function() {
    wx.showModal({
      title: '用户协议',
      content: '这里是用户协议内容...',
      showCancel: false
    })
  },

  /**
   * 查看隐私政策
   */
  viewPrivacyPolicy: function() {
    wx.showModal({
      title: '隐私政策',
      content: '这里是隐私政策内容...',
      showCancel: false
    })
  }
})